//Defs
#ifndef FAT32DEFS_H_
#define FAT32DEFS_H_
#include <stdint.h>
#define TAM_ENTRADA_DIR	        32
#define TAM_CLUSTER             4096
#define TAM_BLOQUE              1024
#define TAM_ENTRADA_FAT         4

#define PATH_CACHE_DUMP "/home/utn_so/cache_dump.txt"



#define NUM_CLUSTER(entrada) (uint32_t)((entrada) & 0x0FFFFFFF)
#define ESFAT_EOC(entrada) (((entrada) & 0x0FFFFFFF) >= 0x0FFFFFF8)
#define FAT_EOC 0x0FFFFFF8
#define t_sec uint8_t[512]
//Entradas longFileName
#define TAM_MAX_NOMBRE		13 //consigna del Tp
#define ULTIMA_LONGNAME 	0x41
#define ES_ULTIMA_LONGNAME(res)	((res & ((char)ULTIMA_LONGNAME) ) == ULTIMA_LONGNAME)

//Entradas de directorios

#define ENT_DIR_LIBRE		    0xe5 //esta libre.Wiki: "Entry has been previously erased and is available"
#define ENT_DIR_LIBRE_ULTIMA    0x00 //la entrada esta libre y las posteriores tambien.
#define ENT_DIR_ESTA_LIBRE(res)	( res == ((char)ENT_DIR_LIBRE) )
#define ENT_DIR_ES_ULTIMA(res)	( res == ((char)ENT_DIR_LIBRE_ULTIMA))
//Atributos de entradas de directorios
#define ATR_SOLO_LECT           0x1
#define ATR_OCULTO         		0x2
#define ATR_SISTEMA        		0x4
#define ATR_NUM_VOLUMEN        	0x8
#define ATR_DIRECTORIO      	0x10
#define ATR_ARCHIVO 	       	0x20
#define ATR_DEVICE       		0x40 //WIKI: Internal use only, never found on disk
#define ATR_SIN_USO         	0x80
#define ATR_LONGNAME 			0x0f  //(ATR_SOLO_LECT | ATR_OCULTO | ATR_SISTEMA | ATR_NUM_VOLUMEN )
//en los elementos
#define ENTRADA_ARCH 	    0x1
#define	ENTRADA_DIR 	    0x2

//tratamiento de fechas en Elementos.

//Bits |Description
//15-9	Year (0 = 1980, 127 = 2107)
//8-5	Month (1 - 12)
//4-0	Day (1 - 31)
#define ANIO_ARCH(origen) 	(uint16_t)((origen >> 9) + 1980)        //"saco" 9 y le sumo 1980
#define MES_ARCH(origen)    (uint16_t)((origen >> 5) & (uint16_t)0xF) //"saco" los 5 ultimos y despues elimino los bits del anio
#define DIA_ARCH(origen) 	(uint16_t)(origen & (uint16_t)0x1F)     //elimino los bits del mes y anio mediante el &

	/* FAT32_FILE_DATE(t_fecha, unsigned short int)*/
#define ARCH_OBT_FECHA(destino, origen)	        destino.anio = ANIO_ARCH(origen); \
												destino.mes = MES_ARCH(origen); \
												destino.dia = DIA_ARCH(origen);
//tratamiento de horarios en Elementos

//Bits |Description
//15-11	Hours (0-23)
//10-5	Minutes (0-59)
//4-0	Seconds/2 (0-29)

#define HORA_ARCH(origen) 		(uint16_t)(origen >> 11)                 //"saco" los 11 ultimos
#define MINUTO_ARCH(origen)	    (uint16_t)((origen >> 5) & (uint16_t)0x3F) //"saco" los 5 primeros y despues saco los bits de la hora con &
#define SEG_ARCH(origen) 		(uint16_t)((origen & (uint16_t)0x1F) * 2)//me quedo solo con los 5 bits de la hora y multiplico X2 por definicion

#define ARCH_OBT_HORA(destino, origen)	        destino.hora = HORA_ARCH(origen); \
												destino.minutos = MINUTO_ARCH(origen); \
												destino.segundos = SEG_ARCH(origen);


typedef struct{
	uint16_t anio;
	uint16_t mes;
	uint16_t dia;
}t_fecha;

typedef struct{
	uint16_t hora;
	uint16_t minutos;
	uint16_t segundos;
}t_hora;


#endif
